package com.scenic.scenicservice.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.scenic.common.bean.Category;
import com.scenic.common.exception.ScenicSpotException;
import com.scenic.common.service.CategoryService;
import com.scenic.scenicservice.mapper.CategoryMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class CategoryServiceImpl implements CategoryService {
    @Autowired
    private CategoryMapper categoryMapper;
    @Override
    public boolean insert(Category category) throws ScenicSpotException {
        /**判断被添加的分类对应的父分类是否存在
         * 1. 根据被添加的分类的parentId 查询其父分类
         * 2.判断这个父分类是否真的是父分类
         *      |-- 不是 抛出异常
         *      |-- 是 -- 继续
         * */
        if (!category.getParentId().equals(0)){
            Category parent = categoryMapper.selectById(category.getParentId());
            if (parent == null || (parent != null && parent.getParentId()!=0)){
                throw new ScenicSpotException("被添加分类的父分类不存在或者不合法,无法添加");
            }
        }

        /**判断同一个父分类下是否有同名的子分类
         * 1.查询同一个父分类下所有的子分类
         * 2.判断是否重名
         * */
        List<Category> list = categoryMapper.selectByParentId(category.getParentId());
        boolean flag = list.stream()
                .anyMatch(item -> item.getName().equals(category.getName()));
        if (flag){
            throw new ScenicSpotException("被添加分类的名字和同级别其他分类的名字相同,不允许添加");
        }
        //添加

        return categoryMapper.insert(category) == 1;
    }

    @Override
    public boolean delete(Integer id) throws ScenicSpotException {
        //根据id查询所有的信息
        Category category = categoryMapper.selectById(id);
        //判断是否存在该商品
        if (category == null){
            throw new ScenicSpotException("该商品不存在，无法删除！");
        }
        //判断是否是父分类
        if (category.getParentId().equals(0) && (category.getChildList().size() > 0)) {
            throw new ScenicSpotException("该分类下还有子分类不能删除！");
        }
        //todo 判断该分类下是否还有商品
        return categoryMapper.delete(id) == 1;
    }

    @Override
    public boolean update(Category category) throws ScenicSpotException {
        Category oldCategory = categoryMapper.selectById(category.getId());
        Category newCategory = category;
        //判断该商品是否存在
        if (oldCategory == null){
            throw new ScenicSpotException("该商品不存在，无法修改");
        }
        //如果父分类下存在子分类，那么这个父分类就不能被修改为子分类
        if (newCategory.getParentId() != null  && oldCategory.getParentId().equals(0)){
            if (!newCategory.getParentId().equals(0) && (!oldCategory.getChildList().isEmpty())){
                throw new ScenicSpotException("无法修改该分类下还有分类！");
            }
            //一个父分类不能把自己设置为父分类
            if (newCategory.getParentId().equals(oldCategory.getId())){
                throw new ScenicSpotException("无法将一个父分类修改为自己的子分类");
            }
        }

        //判断同一个父分类下是否有同名的子分类
        if (categoryMapper.selectByParentId(newCategory.getParentId())
                .stream()
                .anyMatch(item -> item.getName().equals(newCategory.getName()) && !item.getId().equals(newCategory.getId()))) {
            throw new ScenicSpotException("该分类下已经有该商品无法修改");
        }
        //修改
        return categoryMapper.update(category) == 1;
    }

    @Override
    public Object selectByCondition(Category category, Integer pageNum, Integer pageSize) {
        if (pageNum == null){
            //不分页查询
            List<Category> categories = categoryMapper.selectByCondition(category);
            for (Category category1 : categories) {
                /*判断是否为父分类
                 * 如果是父分类那么就是count就统计下面的子分类
                 * 如果是子分类就统计本身
                 * */
                if (category1.getParentId() == 0){
                    Category condition = new Category();
                    condition.setParentId(category1.getId());
                    List<Category> categoriesList = categoryMapper.selectByCondition(condition);
                    category1.setCount(categoriesList.size());
                }
            }
            return categories;
        }else {
            //分页
            PageHelper.startPage(pageNum, pageSize);
            List<Category> list = categoryMapper.selectByCondition(category);
            PageInfo<Category> pageInfo = new PageInfo<>(list);
            return pageInfo;
        }
    }

    @Override
    public Category selectById(Integer id) {
        return categoryMapper.selectById(id);
    }
}
